<?php
namespace Api\Controller;
use Think\Controller;

require_once './ThinkPHP/Library/Vendor/AliPayWeb/pagepay/service/AlipayTradeService.php';
class AliPayWebController extends Controller {
    /**
     * 支付宝电脑网站支付---扫码支付
     * 业务必传请求参数
     * @param out_trade_no (必选) 64个字符以内、可包含字母、数字、下划线
     * @param total_amount (必选) 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]
     * @param subject (必选) 订单标题
     *
     * 注：$data为模拟订单数据，$config在配置中配置由C获取
     *
     */

    public function aliPayDong($data)
    {
        require_once './ThinkPHP/Library/Vendor/AliPayWeb/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';

        //构造参数
        $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
        $payRequestBuilder->setSubject(trim($data['order_name']));//订单名称
        // $payRequestBuilder->setTotalAmount(trim($data['order_totalprice']));//订单总价
        $payRequestBuilder->setTotalAmount(0.01);//订单总价
        $payRequestBuilder->setOutTradeNo(trim($data['order_num']));//订单编号

        $config = C('WEB_ALIPAY_CONFIG');
        $aop = new \AlipayTradeService($config);

        /**
         * pagePay 电脑网站支付请求
         * @param $builder 业务参数，使用buildmodel中的对象生成。
         * @param $return_url 同步跳转地址，公网可以访问
         * @param $notify_url 异步通知地址，公网可以访问
         * @return $response 支付宝返回的信息
         */
        $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);

        //输出表单
        var_dump($response);
    }

    //同步跳转
    public function return_url()
    {
        //接收阿里云同步回调数据get方式返回数据
        $arr=$_GET;
        $config = C('WEB_ALIPAY_CONFIG');//引入所有配置
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            $out_trade_no = htmlspecialchars($_GET['out_trade_no']);

            //支付成功跳转到订单列表
            $this->redirect('Home/Order/orderList',array('status'=>2));

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            $this->error('验证失败！',U('Home/Order/orderList'));
        }
    }
    //异步通知
    public function notify_url()
    {
        $config = C('WEB_ALIPAY_CONFIG');
        $arr=$_POST;
        $alipaySevice = new \AlipayTradeService($config);
//        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);

        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
        2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
        3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

            //商户订单号

            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号

            $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];

            if($_POST['trade_status'] == 'TRADE_FINISHED') {

                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                $this->paySuccessDoing($out_trade_no);
                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理，不执行商户的业务程序
                $this->paySuccessDoing($out_trade_no);
                //注意：
                //付款完成后，支付宝系统发送该交易状态通知
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            echo "success";	//请不要修改或删除
        }else {
            //验证失败
            echo "fail";

        }
    }

    //对已付款订单的处理
    public function paySuccessDoing($out_trade_no)
    {
        //查询订单数据 未支付时进行处理
        $orderData = M('order')
            ->field('order_id,order_paystatus')
            ->where(array('order_num'=>$out_trade_no))
            ->find();
//            var_dump($data);
//            var_dump($orderData);
        if(!empty($orderData) && $orderData['order_paystatus'] == 1){
            $updateData = array(
                'order_id' => $orderData['order_id'],
                'order_paystatus' => 2,
            );
            $updateRes = M('order')->save($updateData);
            if($updateRes){
                return true;
            }
        }
        echo 'fail';
        die;
    }

}
